package com.leetcode;

import java.util.HashSet;
import java.util.Set;

/**
 * LongestSubStringRepeat..
 *
 * @author Lizhong
 * @date 2019/4/30
 */
public class LongestSubStringRepeat {
    public static void main(String[] args) {
        int solution = hasRepeat0("pwwkew");
        System.out.println(solution);
    }

    /**
     * 思路用一个数组保存所有ASCII码，若
     * 没有重复则等于0，r+1==0&&r+1<len,[[r+1]]=1 ,r++
     * 若有重复不等于0，[[l]]--,l++若重复相邻，或右端到结尾了 一直减直到那那个位置，
     *
     * 注意r的起始位置 -1 ，真实位置r+1
     * @param s
     * @return
     */
    private static int hasRepeat0(String s) {
        int[] temp = new int[256];
        char[] chars = s.toCharArray();

        int l = 0, r = -1, result = 0;
        int length = chars.length;
        while (l < length) {
            if (r + 1 < length && temp[chars[r + 1]] == 0) {
                temp[chars[r + 1]]++;
                r++;
            } else {
                temp[chars[l]]--;
                l++;
            }
            // r+1才是真实位置
            result = r + 1 - l > result ? (r + 1 - l) : result;

        }
        return result;
    }

    /**
     * 方法二 、如果有重复一直 --核心
     * @param s
     * @return
     */
    private static int hasRepeat1(String s) {
        int i = 0, j = 0, max = 0;
        Set<Character> set = new HashSet<>();

        while (j < s.length()) {
            if (!set.contains(s.charAt(j))) {
                set.add(s.charAt(j++));
                max = Math.max(max, set.size());
            } else {
                set.remove(s.charAt(i++));
            }
        }

        return max;
    }
}



